hello guys,

i don't know whats wrong here, when i tried to make heap allocation for my program using HeapCreate(), it compiles but always terminates.

The example i studied used GetProcessHeap.

this is my code:

Code:
#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
void CreateMenuBar(HWND);
void OpenDialog(HWND);
void LoadFile(LPSTR);


#define IDM_FILE_NEW 1
HWND ghwndEdit;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
    MSG msg;
    WNDCLASS wc = {0};
    wc.lpszClassName = TEXT("OpenDialog");
    wc.hInstance = hInstance;
    wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
    wc.lpfnWndProc = WndProc;
    wc.hCursor = LoadCursor(0, IDC_ARROW);

    RegisterClass(&wc);
    CreateWindow(wc.lpszClassName, TEXT("OpenDialog"), WS_OVERLAPPEDWINDOW | WS_VISIBLE, 150, 150, 265, 200, 0, 0, hInstance, 0);

    while(GetMessage(&msg, NULL, 0, 0)){
        DispatchMessage(&msg);
    }
    
    return (int)msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){
    switch(msg){
        case WM_CREATE:
            ghwndEdit = CreateWindowEx(WS_EX_RIGHTSCROLLBAR, TEXT("edit"), NULL, WS_VISIBLE | WS_CHILD | WS_HSCROLL | WS_VSCROLL | ES_MULTILINE, 0, 0, 260, 180, hwnd, (HMENU)1, NULL, NULL);
            CreateMenuBar(hwnd);
            break;
        case WM_SIZE:
            SetWindowPos(ghwndEdit, NULL, 0, 0, LOWORD(lParam), HIWORD(lParam), SWP_NOMOVE | SWP_NOZORDER);
            break;
        case WM_COMMAND:
            if(wParam == IDM_FILE_NEW)
                OpenDialog(hwnd);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
    }
    return DefWindowProc(hwnd, msg, wParam, lParam);
}


void CreateMenuBar(HWND hwnd){
    HMENU hMenuBar;
    HMENU hMenu;

    hMenuBar = CreateMenu();
    hMenu = CreateMenu();

    AppendMenu(hMenuBar, MF_POPUP, (UINT_PTR)hMenu, TEXT("&File"));
    AppendMenu(hMenu, MF_STRING, IDM_FILE_NEW, TEXT("&Open"));
    SetMenu(hwnd, hMenuBar);

}

void OpenDialog(HWND hwnd){
    OPENFILENAME ofn;
    TCHAR szFile[MAX_PATH];

    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(ofn);
    ofn.lpstrFile = szFile;
    ofn.lpstrFile[0] = '\0';
    ofn.hwndOwner = hwnd;
    ofn.nMaxFile = sizeof(szFile);
    ofn.lpstrFilter = TEXT("All files(*.*)\0*.*\0");
    ofn.nFilterIndex = 1;
    ofn.lpstrInitialDir = NULL;
    ofn.lpstrFileTitle = NULL;
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

    if(GetOpenFileName(&ofn))
        LoadFile(ofn.lpstrFile);
}

void LoadFile(LPSTR File){
    HANDLE hFile;
    DWORD dwSize;
    DWORD dw;

    LPBYTE lpBuffer = NULL;

    hFile = CreateFile(File, GENERIC_READ |  GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
    dwSize = GetFileSize(hFile, NULL); 
    lpBuffer = (LPBYTE) HeapAlloc (HeapCreate(HEAP_GENERATE_EXCEPTIONS, 0, 0), HEAP_ZERO_MEMORY, dwSize);
    ReadFile(hFile, lpBuffer, dwSize, &dw, NULL);
    CloseHandle(hFile);
    lpBuffer[dwSize] = 0;
    SetWindowText(ghwndEdit, (LPSTR)lpBuffer);
    HeapFree(GetProcessHeap(), 0, lpBuffer);
}